package com.gujia.concurrency.example.atomic;

import com.gujia.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

@Slf4j
@ThreadSafe
public class AtomicExample6 {
    
    //请求总数
    public  static  int clientTotal = 5000;

    //同时并发执行的线程数
    public static int threadTotal = 200;

    public static AtomicInteger count = new AtomicInteger();
    //适用于多线程情况下，一个方法只执行一次的情况
    private static AtomicBoolean isHappened = new AtomicBoolean(false);

    //private static Boolean isHappened = false;


    public static void main(String[] args) throws Exception {

            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal ; i++) {
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        test();
                        semaphore.release();
                    } catch (Exception e) {
                     //   log.error("exception", e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
         //   log.info("isHappened:{}", isHappened.get());
        System.out.println("isHappend:"+isHappened);
        }

        private static void test() {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (isHappened.compareAndSet(false, true)) {

                System.out.println("excute:"+isHappened);
            }

            /*if(!isHappened){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                isHappened = true;
                System.out.println("excute:"+isHappened);
            }*/
        }






}
